/**
 * @file unicode.h
 * @author Asukai (3474790137@qq.com)
 * @brief unicode 编码工具函数集
 * @version 0.1
 * @date 2024-03-12
 * 
 * @copyright Copyright (c) 2024
 * 
 */
#pragma once

/*
    unicode 编码：使用两个字节
    UTF-8 编码规则
    1 个字节：使用 ASCII 编码，最高位为 0
    n 个字节：第一个字节前 n 位为 1 ，n+1 位为 0 ，后面字节的前两位一律为 10
*/

#include <cstddef>
#include <cstdint>
#include <optional>
#include <vector>
/**
 * @brief Get the Byte Num Of Encode Utf8 object
 * 
 * @param value 
 * @return size_t
 * @retval 返回 unicode 码点转化为 UTF-8 编码所需字节数
 * @attention 若超过范围则返回 0
 * @note 0 <= retval <= 4
 */
auto getByteNumOfEncodeUtf8(int value) noexcept -> uint8_t;

/**
 * @brief Get the Byte Num Of Decode Utf8 object
 * 
 * @param value 
 * @return size_t 
 * @retval 返回 UTF-8 编码字符的长度
 * @note 0 <= reval <= 4
 */
auto getByteNumOfDecodeUtf8(uint8_t value) noexcept -> uint8_t;

auto encodeToUtf8(uint32_t value) -> std::vector<uint8_t>;
auto decodeFromUtf8(std::vector<uint8_t>& buf) noexcept -> std::optional<uint32_t>;